Non-Circulating Visitors

방문자 디자인 패턴은 크게 두가지 유형으로 구분된다.
- 순환 방문자:
함수 오버로딩에 기반하는 방문자, 클래스 계층과 방문자간에 상호 참조하는 순환적인 종속성이 발생
- 비순환 방문자:
런타임 타입 정보(RTTI)에 의존하는 방문자, 방문될 클래스 계층에 제한이 없다. 성능에서는 약간의 손해
비순환 방문자 패턴에서 방문자의 인터페이스 정의
template <typename Visitable>
struct Visitor{
virtual void visit(Visitable& obj)=0;
};
struct VisitorBase{ //
virtual ~VisitorBase()= default;
}; // ,
struct Expression{
virtual ~Expression()= default;
virtual void accept(VisitorBase& obj){
using EV=Visitor<Expression>;
if(auto ev=dynamic_cast<EV*>(&obj)) ev->visit(*this);
}
};
struct ExpressionPrinter: VisitorBase, Visitor<DoubleExpression>, Visitor<AdditionExpression>{
void visit(DoubleExpression& obj) override;
void visit(AdditionExpression& obj) override;
string str() const { return oss.str(); }
private:
ostringstream oss;
};